#ifndef __XLX_FUNC_H__
#define __XLX_FUNC_H__

#include <stdint.h>

#include "xlx_common.h"

#define XLX_PI 3.14159

/**
 * 计算crc16
 * @param szdata 数据
 * @param len 数据长度
 */
uint16_t xlx_crc16(const char *szdata,int len);

/**
 * 当前大小端
 * @return 1：大端  0：小端
 */
int xlx_big_endian(void);

/**
 *打印数据显示为16进制格式
 *@param tag 日志中的标记字符串
 *@param data 数据
 *@param len 数据长度
 */
void xlx_print_hex(const char *tag,const char *data,int len);

/**
 * 切割字符串
 * @param str 字符内容
 * @param split 切割符号
 * @param outarray 切割完返回的数组内容
 * @param outbuflen 用来装结果内容的大小
 */
int xlx_split_string(char *str,const char *split,char **outarray,int outbuflen);


uint64_t xlx_htonll(uint64_t val);

uint32_t xlx_htonl(uint32_t val);

uint16_t xlx_htons(uint16_t val);

//转换成时间戳
uint32_t xlx_mktime(TutuTime *tt);

//转换成时间戳
uint32_t xlx_2timestamp_fast(TutuTime *tt);

//时间戳转换成日期
void xlx_localtime(uint32_t time,TutuTime *t);

//字符串拷贝
void xlx_strcopy(char *dst,int maxsize,const char *src);

/**
 * 判断字符是否为ip，还是域名
 * @param host 字符串
 * @return 1:ip 0：域名
 */
char xlx_str_is_ip(const char *host);

/**
 * 计算gps之间的距离，米
 * @param lng1 经度1
 * @param lat1 纬度1
 * @param lng2 经度2
 * @param lat2 纬度2
 */
double xlx_gps_distance(double lng1,double lat1,double lng2,double lat2);

/**
 * 字符串转cbd编码格式
 * @param data 字符串
 * @param size 字符串长度
 * @param output 输出bcd结果
 */
void xlx_char2bcd(const char *data,int size,char *output);

/**
 * 经纬度转换成字符串
 * @param val 经度或纬度
 * @param pout 需传入的缓存区大小为12个字节以上,能得到转换成功后的结果
 * @param latlon 1:lat  0:lon
 * @return 
 */
void xlx_latlng2str(uint64_t val,char* pout,char latlon);

/**
 * 计算整数n二进制中有多少个1
 */
int xlx_count_bits(int64_t n);

/**
 * @brief 字符串替换功能
 * 
 * @param str 原始字符串
 * @param srcSubStr 被替换的字符串
 * @param dstSubStr 替换成的字符串
 * @param out 输出buff
 * @return int 被替换了几次
 */
int str_replace(char* str, char* srcSubStr, char* dstSubStr, char* out);

void str_to_upper(char *str);
unsigned short search_sub_str_position(const char *pStrSub,const char *pStr);

#endif
